return {
    "nvim-neo-tree/neo-tree.nvim",
    branch = "v3.x",
    dependencies = {
      "nvim-lua/plenary.nvim",
      "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
      "MunifTanjim/nui.nvim",
    }, 
    keys = {
      { "<leader>e", "<cmd>Neotree toggle<cr>", desc = "Neotree" },
    },
    config = function()
        vim.cmd([[ let g:neo_tree_remove_legacy_commands = 1 ]])
        -- H: 查看隐藏文件
        -- r: 重命名
        -- A: 新建目录
        -- a: 新建文件
        -- d: 删除文件
        -- f: 查找文件
        -- c: 复制文件
        -- x: 剪切文件
        -- t: 在新标签页打开
        -- P: 悬浮窗预览文件
        -- m: 移动文件
        -- s: 左右分屏打开
        -- S: 上下分屏打开
        -- y: 标记要复制的文件
        -- x: 标记要剪切的文件
        -- C: 折叠当前目录
        -- z: 折叠所有目录
        -- < 和 >: 切换 tags
        require("neo-tree").setup({
            --	window = {
            --        mappings = {
            --			["P"] = { "toggle_preview", config = { use_float = false } }, -- true: 默认值,用悬浮窗预留. false: 在当前窗口预留
            --        }
            --	},
            source_selector = {
                winbar = false,           -- 是否打开标签页
                statusline = true,        -- toggle to show selector on statusline
                show_scrolled_off_parent_node = true, -- false: 向下滚动标签页不会小时. true: 向下滚动标签页会消失,替换为离顶部最近目录的绝对路径(相对于家目录的绝对路径).
                sources = {               -- table
                    {
                        source = "filesystem", -- string
                        display_name = "  Files ", -- string | nil
                    },
                    {
                        source = "buffers", -- string
                        display_name = "  Buffers ", -- string | nil
                    },
                    {
                        source = "git_status", -- string
                        display_name = "  Git ", -- string | nil
                    },
                },
                content_layout = "end",                       -- string
                tabs_layout = "equal",                        -- string
                truncation_character = "…",                 -- string
                tabs_min_width = nil,                         -- int | nil
                tabs_max_width = nil,                         -- int | nil
                padding = 0,                                  -- int | { left: int, right: int }
                separator = { left = "▏", right = "▕" },  -- string | { left: string, right: string, override: string | nil }
                separator_active = nil,                       -- string | { left: string, right: string, override: string | nil } | nil
                show_separator_on_edge = true,                -- boolean
                highlight_tab = "NeoTreeTabInactive",         -- string
                highlight_tab_active = "NeoTreeTabActive",    -- string
                highlight_background = "NeoTreeTabInactive",  -- string
                highlight_separator = "NeoTreeTabSeparatorInactive", -- string
                highlight_separator_active = "NeoTreeTabSeparatorActive", -- string
            },
            filesystem = {                                    --
                filtered_items = {
                    visible = true,                           -- 是否显示隐藏文件
                    hide_dotfiles = true,                     -- 只隐藏 以 . 为开头的文件
                    hide_gitignored = true,
                    hide_hidden = true,                       -- only works on Windows for hidden files/directories
                    hide_by_name = {
                        ".DS_Store",
                        "thumbs.db",
                        --"node_modules",
                    },
                    hide_by_pattern = {
                        --"*.meta",
                        --"*/src/*/tsconfig.json",
                    },
                    always_show = { -- remains visible even if other settings would normally hide it
                        --".gitignored",
                    },
                    never_show = { -- remains hidden even if visible is toggled to true, this overrides always_show
                        --".DS_Store",
                        --"thumbs.db",
                    },
                    never_show_by_pattern = { -- uses glob style patterns
                        --".null-ls_*",
                    },
                },
            },

            -- 文件的 git status 的状态
            enable_git_status = false, -- 禁止显示git 状态

            default_component_configs = {
                -- 子文件的缩进样式
                indent = {
                    -- 是否开启缩进样式
                    with_markers = true,
                    -- 缩进样式所用的图标字符
                    indent_marker = "│",
                    last_indent_marker = "└",
                    -- 子文件与父文件的缩进距离
                    indent_size = 2,

                    -- 文件夹 展开图标设置
                    with_expanders = true,
                    expander_collapsed = "",
                    expander_expanded = "",
                    expander_highlight = "NeoTreeExpander",
                },

                icon = {
                    folder_empty = "󰜌",
                    folder_empty_open = "󰜌",
                },
                git_status = {
                    symbols = {
                        -- Change type
                        added = "", -- or "✚", but this is redundant info if you use git_status_colors on the name
                        modified = "", -- or "", but this is redundant info if you use git_status_colors on the name
                        deleted = "✖", -- this can only be used in the git_status source
                        renamed = "", -- this can only be used in the git_status source
                        -- Status type
                        untracked = "",
                        ignored = "",
                        unstaged = "",
                        staged = "",
                        conflict = "",
                    },
                },
            },
            window = {
                position = "left",
                width = 30,
                mapping_options = {
                    noremap = true,
                    nowait = true,
                },
                mappings = {
                    ["<space>"] = {
                        "toggle_node",
                        nowait = false, -- disable `nowait` if you have existing combos starting with this char that you want to use
                    },
                    ["<2-LeftMouse>"] = "open",
                    ["<cr>"] = "open",
                    ["<esc>"] = "revert_preview",
                    ["P"] = { "toggle_preview", config = { use_float = true } },
                    ["l"] = "focus_preview",
                    ["S"] = "open_split",
                    ["s"] = "open_vsplit",
                    -- ["S"] = "split_with_window_picker",
                    -- ["s"] = "vsplit_with_window_picker",
                    ["t"] = "open_tabnew",
                    -- ["<cr>"] = "open_drop",
                    -- ["t"] = "open_tab_drop",
                    ["w"] = "open_with_window_picker",
                    --["P"] = "toggle_preview", -- enter preview mode, which shows the current node without focusing
                    ["C"] = "close_node",
                    -- ['C'] = 'close_all_subnodes',
                    ["z"] = "close_all_nodes",
                    --["Z"] = "expand_all_nodes",
                    ["a"] = {
                        "add",
                        -- this command supports BASH style brace expansion ("x{a,b,c}" -> xa,xb,xc). see `:h neo-tree-file-actions` for details
                        -- some commands may take optional config options, see `:h neo-tree-mappings` for details
                        config = {
                            show_path = "none", -- "none", "relative", "absolute"
                        },
                    },
                    ["A"] = "add_directory", -- also accepts the optional config.show_path option like "add". this also supports BASH style brace expansion.
                    ["d"] = "delete",
                    ["r"] = "rename",
                    ["y"] = "copy_to_clipboard",
                    ["x"] = "cut_to_clipboard",
                    ["p"] = "paste_from_clipboard",
                    ["c"] = "copy", -- takes text input for destination, also accepts the optional config.show_path option like "add":
                    -- ["c"] = {
                    --  "copy",
                    --  config = {
                    --    show_path = "none" -- "none", "relative", "absolute"
                    --  }
                    --}
                    ["m"] = "move", -- takes text input for destination, also accepts the optional config.show_path option like "add".
                    ["q"] = "close_window",
                    ["R"] = "refresh",
                    ["?"] = "show_help",
                    ["<"] = "prev_source",
                    [">"] = "next_source",
                },
            },

            document_symbols = {
                kinds = {
                    File = { icon = "󰈙", hl = "Tag" },
                    Namespace = { icon = "󰌗", hl = "Include" },
                    Package = { icon = "󰏖", hl = "Label" },
                    Class = { icon = "󰌗", hl = "Include" },
                    Property = { icon = "󰆧", hl = "@property" },
                    Enum = { icon = "󰒻", hl = "@number" },
                    Function = { icon = "󰊕", hl = "Function" },
                    String = { icon = "󰀬", hl = "String" },
                    Number = { icon = "󰎠", hl = "Number" },
                    Array = { icon = "󰅪", hl = "Type" },
                    Object = { icon = "󰅩", hl = "Type" },
                    Key = { icon = "󰌋", hl = "" },
                    Struct = { icon = "󰌗", hl = "Type" },
                    Operator = { icon = "󰆕", hl = "Operator" },
                    TypeParameter = { icon = "󰊄", hl = "Type" },
                    StaticMethod = { icon = "󰠄 ", hl = "Function" },
                },
            },
        })
    end,
}
